/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Jan-Hendrik Diederich, Bredex GmbH - bug 201052
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 430616, 441267, 441282, 445609, 441280, 472654
* Simon Scholz <scholzsimon@vogella.com> - Bug 473845
*******************************************************************************/
package org.eclipse.ui.internal.registry;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.descriptor.basic.MPartDescriptor;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.activities.WorkbenchActivityHelper;
import org.eclipse.ui.internal.IWorkbenchConstants;
import org.eclipse.ui.internal.e4.compatibility.CompatibilityPart;
import org.eclipse.ui.internal.menus.MenuHelper;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.IStickyViewDescriptor;
import org.eclipse.ui.views.IViewCategory;
import org.eclipse.ui.views.IViewDescriptor;
import org.eclipse.ui.views.IViewRegistry;
import org.osgi.framework.Bundle;
public class ViewRegistry implements IViewRegistry {
public static final String VIEW_TAG = "View"; //$NON-NLS-1$
/**
* This constant is used as key for persisting the original class for a
* legacy {@link ViewPart} in the persisted state of a
* {@link MPartDescriptor}.
*/
public static final String ORIGINAL_COMPATIBILITY_VIEW_CLASS = "originalCompatibilityViewClass"; //$NON-NLS-1$
/**
* This constant is used as key for persisting the original bundle for a
* legacy {@link ViewPart} in the persisted state of a
* {@link MPartDescriptor}.
*/
public static final String ORIGINAL_COMPATIBILITY_VIEW_BUNDLE = "originalCompatibilityViewBundle"; //$NON-NLS-1$
@Inject
private MApplication application;
@Inject
private EModelService modelService;
@Inject
private IExtensionRegistry extensionRegistry;
@Inject
private IWorkbench workbench;
@Inject
Logger logger;
private Map<String, IViewDescriptor> descriptors = new HashMap<>();
private List<IStickyViewDescriptor> stickyDescriptors = new ArrayList<>();
private HashMap<String, ViewCategory> categories = new HashMap<>();
private Category miscCategory = new Category();
@PostConstruct
void postConstruct() {
IExtensionPoint point = extensionRegistry.getExtensionPoint("org.eclipse.ui.views"); //$NON-NLS-1$
for (IExtension extension : point.getExtensions()) {
// find the category first
for (IConfigurationElement element : extension.getConfigurationElements()) {
if (element.getName().equals(IWorkbenchRegistryConstants.TAG_CATEGORY)) {
ViewCategory category = new ViewCategory(
element.getAttribute(IWorkbenchRegistryConstants.ATT_ID),
element.getAttribute(IWorkbenchRegistryConstants.ATT_NAME));
categories.put(category.getId(), category);
} else if (element.getName().equals(IWorkbenchRegistryConstants.TAG_STICKYVIEW)) {
try {
stickyDescriptors.add(new StickyViewDescriptor(element));
} catch (CoreException e) {
// log an error since its not safe to open a dialog here
logger.error("Unable to create sticky view descriptor.", e.getStatus()); //$NON-NLS-1$
}
}
}
}
if (!categories.containsKey(miscCategory.getId())) {
categories.put(miscCategory.getId(), new ViewCategory(miscCategory.getId(),
miscCategory.getLabel()));
}
for (IExtension extension : point.getExtensions()) {
for (IConfigurationElement element : extension.getConfigurationElements()) {
if (element.getName().equals(IWorkbenchRegistryConstants.TAG_VIEW)) {
createDescriptor(element, false);
}
if (element.getName().equals(IWorkbenchRegistryConstants.TAG_E4VIEW)) {
createDescriptor(element, true);
}
}
}
}
private void createDescriptor(IConfigurationElement element, boolean e4View) {
String id = element.getAttribute(IWorkbenchRegistryConstants.ATT_ID);
MPartDescriptor descriptor = null;
List<MPartDescriptor> currentDescriptors = application.getDescriptors();
for (MPartDescriptor desc : currentDescriptors) {
// do we have a matching descriptor?
if (desc.getElementId().equals(id)) {
descriptor = desc;
break;
}
}
if (descriptor == null) { // create a new descriptor
descriptor = modelService.createModelElement(MPartDescriptor.class);
descriptor.setElementId(id);
application.getDescriptors().add(descriptor);
}
// ==> Update descriptor
descriptor.setLabel(element.getAttribute(IWorkbenchRegistryConstants.ATT_NAME));
List<String> tags = descriptor.getTags();
tags.add(VIEW_TAG);
descriptor.setCloseable(true);
descriptor.setAllowMultiple(Boolean.parseBoolean(element
.getAttribute(IWorkbenchRegistryConstants.ATT_ALLOW_MULTIPLE)));
// make view description available as tooltip
String viewDescription = RegistryReader.getDescription(element);
descriptor.setTooltip(viewDescription);
// Is this an E4 part or a legacy IViewPart ?
String clsSpec = element.getAttribute(IWorkbenchConstants.TAG_CLASS);
String implementationURI = CompatibilityPart.COMPATIBILITY_VIEW_URI;
if (e4View) {
implementationURI = "bundleclass://" + element.getContributor().getName() + "/" + clsSpec; //$NON-NLS-1$//$NON-NLS-2$
} else {
IExtension declaringExtension = element.getDeclaringExtension();
String name = declaringExtension.getContributor().getName();
Bundle bundle = Platform.getBundle(name);
// the indexOf operation removes potential additional information
// from the qualified classname
int colonIndex = clsSpec.indexOf(':');
String viewClass = colonIndex == -1 ? clsSpec : clsSpec.substring(0, colonIndex);
descriptor.getPersistedState().put(ORIGINAL_COMPATIBILITY_VIEW_CLASS, viewClass);
descriptor.getPersistedState().put(ORIGINAL_COMPATIBILITY_VIEW_BUNDLE, bundle.getSymbolicName());
boolean useDependencyInjection = Boolean
.parseBoolean(element.getAttribute(IWorkbenchConstants.TAG_USE_DEPENDENCY_INJECTION));
if (useDependencyInjection) {
descriptor.getTags().add(IWorkbenchConstants.TAG_USE_DEPENDENCY_INJECTION);
}
}
descriptor.setContributionURI(implementationURI);
String iconURI = MenuHelper.getIconURI(element, IWorkbenchRegistryConstants.ATT_ICON);
if (iconURI == null) {
descriptor.setIconURI(MenuHelper.getImageUrl(workbench.getSharedImages()
.getImageDescriptor(ISharedImages.IMG_DEF_VIEW)));
} else {
descriptor.setIconURI(iconURI);
}
String categoryId = element.getAttribute(IWorkbenchRegistryConstants.ATT_CATEGORY);
ViewCategory category = findCategory(categoryId);
if (category == null) {
category = findCategory(miscCategory.getId());
}
if (category != null) {
tags.add("categoryTag:" + category.getLabel()); //$NON-NLS-1$
descriptor.setCategory(category.getLabel());
}
// ==> End of update descriptor
ViewDescriptor viewDescriptor = new ViewDescriptor(application, descriptor, element);
descriptors.put(descriptor.getElementId(), viewDescriptor);
if (category != null) {
category.addDescriptor(viewDescriptor);
}
}
@Override
public IViewDescriptor find(String id) {
IViewDescriptor candidate = descriptors.get(id);
if (WorkbenchActivityHelper.restrictUseOf(candidate)) {
return null;
}
return candidate;
}
@Override
public IViewCategory[] getCategories() {
return categories.values().toArray(new IViewCategory[categories.size()]);
}
@Override
public IViewDescriptor[] getViews() {
Collection<?> allowedViews = WorkbenchActivityHelper.restrictCollection(
descriptors.values(), new ArrayList<>());
return allowedViews.toArray(new IViewDescriptor[allowedViews.size()]);
}
@Override
public IStickyViewDescriptor[] getStickyViews() {
Collection<?> allowedViews = WorkbenchActivityHelper.restrictCollection(stickyDescriptors,
new ArrayList<>());
return allowedViews.toArray(new IStickyViewDescriptor[allowedViews.size()]);
}
/**
* Returns the {@link ViewCategory} for the given id or <code>null</code> if
* one cannot be found or the id is <code>null</code>
*
* @param id
* the {@link ViewCategory} id
* @return the {@link ViewCategory} with the given id or <code>null</code>
*/
public ViewCategory findCategory(String id) {
if (id == null) {
return categories.get(miscCategory.getId());
}
return categories.get(id);
}
public Category getMiscCategory() {
return miscCategory;
}
}